/*
 * xml.h
 *
 *  Created on: 2017年5月22日
 *      Author: xfwangqiang
 */

/*========================================================*
 * 程序修改记录：
 * <版本号> <修改日期>, <修改人员>: <修改功能概述>
 *  V1.0.0  2017-06-05  xfwangqiang     创建
 *========================================================*/

#ifndef XML_NODE_H_
#define XML_NODE_H_

#include "xml_typedefs.h"
#include "xml_config.h"

// 定义XML节点的类型枚举，根据DOM来定义的
enum xmlnode_type {
	ELEMENT_NODE = 1,
	ATTRIBUTE_NODE,
	TEXT_NODE,
	CDATA_SECTION_NODE,
	ENTITY_REFERENCE_NODE,
	ENTITY_NODE,
	PROCESSING_INSTRUCTION_NODE,
	COMMENT_NODE,
	DOCUMENT_NODE,
	DOCUMENT_TYPE_NODE,
	DOCUMENT_FRAGMENT_NODE,
	NOTATION_NODE,
};

// 定义读取函数的原型
typedef int (*xml_get_func)( void *this, char *buffer  );
typedef int (*xml_get_func1)(  void *this , char *name, char *buffer );

// 定义XML节点对象的数据结构
struct xmlnode {
	char *name;					// 节点的名字
	char *value;				// 节点的值
	enum xmlnode_type type;		// 节点的类型
	struct xmlnode *father;		// 父节点
	struct xmlnode *next;		// 下一个兄弟节点对象
	struct xmlnode *prev;		// 上一个兄弟节点对象
	struct xmlnode *child;		// 第一个子节点
	xml_get_func getname;		// 得到节点名字方法
	xml_get_func getvalue;			// 得到节点值方法
};



// 声明函数原型

//============================================================================
// 函数名称：new_xml_node
// 函数功能：创建一个新的XML节点对象--构造函数
//
// 输入参数： 1 -- 节点名称
//			2 -- 节点值
//			3 -- 节点类型
// 输出参数：
// 返回值：节点对象指针
// 说明：创建一个新的XML节点对象--构造函数
//============================================================================
struct xmlnode *new_xmlnode(char *name, char *value, enum xmlnode_type type );


//============================================================================
// 函数名称：del_xml_node
// 函数功能：删除一个XML节点对象--析构函数
//
// 输入参数： 1 -- 节点名称
//			2 -- 节点值
//			3 -- 节点类型
// 输出参数：
// 返回值：节点对象指针
// 说明：删除一个XML节点对象--析构函数
//============================================================================
void del_xmlnode( void *this );



//============================================================================
// 函数名称：xmlnode_init
// 函数功能：初始化一个新的XML节点对象--构造函数
//
// 输入参数： 1 -- 节点对象
// 			2 -- 节点名称
//			3 -- 节点值
//			4 -- 节点类型
// 输出参数：
// 返回值：
// 说明：初始化一个新的XML节点对象--构造函数
//============================================================================
void xmlnode_init( void *this , char *name, char *value, enum xmlnode_type type );

//============================================================================
// 函数名称：xml_get_node_name
// 函数功能：得到一个节点对象的名字
//
// 输入参数： 1 -- 节点对象自身
// 输出参数：	2 -- 输出名字
// 返回值：名字的长度
// 说明：得到一个节点对象的名字
//============================================================================
int xmlnode_getname(  void *this, char *buffer  );


//============================================================================
// 函数名称：xml_get_node_name
// 函数功能：得到一个节点对象的值
//
// 输入参数： 1 -- 节点对象自身
// 输出参数：	2 -- 输出值
// 返回值：名字的值的字符串长度
// 说明：得到一个节点对象的值
//============================================================================
int xmlnode_getvalue(  void *this, char *buffer  );



//============================================================================
// 函数名称：xmlnode_setfather
// 函数功能：设置一个节点对象父节点
//
// 输入参数： 1 -- 节点对象自身
//			  2 -- 父节点对象
// 输出参数：
// 返回值：节点对象第父节点
// 说明：设置一个节点对象父节点
//============================================================================
int xmlnode_setfather(void *this, struct xmlnode *father);


//============================================================================
// 函数名称：xmlnode_getfather
// 函数功能：得到一个节点对象父节点
//
// 输入参数： 1 -- 节点对象自身
// 输出参数：
// 返回值：节点对象第父节点
// 说明：得到一个节点对象父节点
//============================================================================
struct xmlnode * xmlnode_getfather(void *this);


//============================================================================
// 函数名称：xmlnode_getchild
// 函数功能：得到一个节点对象第一个子节点
//
// 输入参数： 1 -- 节点对象自身
// 输出参数：
// 返回值：节点对象第一个子节点
// 说明：得到一个节点对象第一个子节点
//============================================================================
struct xmlnode * xmlnode_getchild(void *this);



//============================================================================
// 函数名称：xmlnode_getprev
// 函数功能：得到一个节点对象上一个兄弟节点
//
// 输入参数： 1 -- 节点对象自身
// 输出参数：
// 返回值：节点对象上一个兄弟节点
// 说明：得到一个节点对象上一个兄弟节点
//============================================================================
struct xmlnode * xmlnode_getprev(void *this);

//============================================================================
// 函数名称：xmlnode_getnext
// 函数功能：得到一个节点对象下一个兄弟节点
//
// 输入参数： 1 -- 节点对象自身
// 输出参数：
// 返回值：节点对象下一个兄弟节点
// 说明：得到一个节点对象下一个兄弟节点
//============================================================================
struct xmlnode * xmlnode_getnext(void *this);


//============================================================================
// 函数名称：xmlnode_add
// 函数功能：从一个链表中增加一个节点对象
//
// 输入参数： 1 -- 链表对象的地址
// 			  2 -- 节点对象自身
// 输出参数：
// 返回值：none
// 说明：链表中元素个数
//============================================================================
int xmlnode_add( struct xmlnode **list, struct xmlnode *node );


//============================================================================
// 函数名称：xml_remove_node
// 函数功能：从一个链表中删除一个节点对象
//
// 输入参数： 1 -- 链表对象的地址
// 			2 -- 节点对象自身
// 输出参数：
// 返回值：none
// 说明：从一个链表中删除一个节点对象
//============================================================================
int xmlnode_remove( struct xmlnode **list, struct xmlnode *node );

//============================================================================
// 函数名称：xml_remove_linklist
// 函数功能：删除一个链表对象
//
// 输入参数： 1 -- 链表对象的地址
// 输出参数：
// 返回值：none
// 说明：删除一个链表对象
//============================================================================
void xmlnode_removelinklist( struct xmlnode **list );











#endif /* XML_NODE_H_ */
